home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_562 / intuisup / editor / source.lzh / req.c < prev    next >
C/C++ Source or Header  |  1991-10-31  |  16KB  |  492 lines

  1.         /*************************************
  2.          *                                   *
  3.          *             Editor v1.0           *
  4.          *   by Torsten Jürgeleit in 07/91   *
  5.          *                                   *
  6.          *            Requester part         *
  7.          *                                   *
  8.          *************************************/
  9.  
  10.     /* Includes */
  11.  
  12. #include "includes.h"
  13. #include "defines.h"
  14. #include "imports.h"
  15. #include "protos.h"
  16.  
  17.     /* Defines for error requester */
  18.  
  19. #define ERROR_WINDOW_TITLE    " Error "
  20.  
  21.     /* Statics for error requester */
  22.  
  23. STATIC BYTE *error_text[] = {
  24.    "Can't open arp.library v39+",
  25.    "Can't open intuisup.library",
  26.    "Can't open diskfont.library",
  27.    "Can't open window",
  28.    "Out of memory",
  29.    "Can't open file",
  30.    "Error while saving",
  31.    "Error while reading",
  32.    "Line in load file too long",
  33.    "Missing argument in load file",
  34.    "Different block types for BEGIN and END in load file"
  35. };
  36.     /* Defines for continue requester */
  37.  
  38. #define CONTINUE_WINDOW_TITLE        (UBYTE *)" Error "
  39. #define CONTINUE_WINDOW_IDCMP        (CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
  40. #define CONTINUE_RENDER_INFO_FLAGS    (RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
  41. #define CONTINUE_OPEN_WINDOW_FLAGS    0
  42.  
  43. #define CONTINUE_GADGET_TYPE        GADGET_DATA_TYPE_BUTTON
  44. #define CONTINUE_GADGET_FLAGS        GADGET_DATA_FLAG_HOT_KEY
  45. #define CONTINUE_GADGET_TEXT        "_Continue"
  46. #define CONTINUE_GADGET_LEFT_EDGE    0
  47. #define CONTINUE_GADGET_TOP_EDGE    0
  48. #define CONTINUE_GADGET_WIDTH        ((8 + 2) * 8)
  49. #define CONTINUE_GADGET_HEIGHT        15
  50. #define CONTINUE_GADGET_TEXT_ATTR    &topaz80_attr
  51.  
  52.     /* Statics for continue requester */
  53.  
  54. STATIC struct NewWindow  continue_new_window = {
  55.    0, 0, 0, 0, 0, 1, CONTINUE_WINDOW_IDCMP, WINDOWCLOSE | WINDOWDRAG |
  56.    WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE, NULL, NULL, NULL,
  57.    NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
  58. };
  59.  
  60. STATIC struct GadgetData  continue_gadget_data[] = {
  61.    {
  62.     CONTINUE_GADGET_TYPE,        /* gd_Type */
  63.     CONTINUE_GADGET_FLAGS,        /* gd_Flags */
  64.     CONTINUE_GADGET_LEFT_EDGE,    /* gd_LeftEdge */
  65.     CONTINUE_GADGET_TOP_EDGE,    /* gd_TopEdge */
  66.     CONTINUE_GADGET_WIDTH,        /* gd_Width */
  67.     CONTINUE_GADGET_HEIGHT,        /* gd_Height */
  68.     CONTINUE_GADGET_TEXT,        /* *gd_Text */
  69.     CONTINUE_GADGET_TEXT_ATTR,    /* *gd_TextAttr */
  70.     { 0, 0, 0 }
  71.    }, {
  72.     INTUISUP_DATA_END        /* mark end of gadget data */
  73.    }
  74. };
  75.     /* Defines for about requester */
  76.  
  77. #define ABOUT_WINDOW_WIDTH        300
  78. #define ABOUT_WINDOW_HEIGHT        115
  79. #define ABOUT_WINDOW_TITLE        (UBYTE *)" About "
  80. #define ABOUT_WINDOW_IDCMP        (CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
  81. #define ABOUT_RENDER_INFO_FLAGS        (RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
  82. #define ABOUT_OPEN_WINDOW_FLAGS        OPEN_WINDOW_FLAG_CENTER_WINDOW
  83.  
  84. #define ABOUT_GADGET_TYPE    GADGET_DATA_TYPE_BUTTON
  85. #define ABOUT_GADGET_FLAGS    GADGET_DATA_FLAG_HOT_KEY
  86. #define ABOUT_GADGET_TEXT    "_Continue"
  87. #define ABOUT_GADGET_LEFT_EDGE    ((ABOUT_WINDOW_WIDTH - ABOUT_GADGET_WIDTH) / 2)
  88. #define ABOUT_GADGET_TOP_EDGE    (ABOUT_WINDOW_HEIGHT - ABOUT_GADGET_HEIGHT - 10)
  89. #define ABOUT_GADGET_WIDTH    ((8 + 2) * 8)
  90. #define ABOUT_GADGET_HEIGHT    15
  91. #define ABOUT_GADGET_TEXT_ATTR    &topaz80_attr
  92.  
  93. #define ABOUT_TEXT1_TYPE    TEXT_DATA_TYPE_TEXT
  94. #define ABOUT_TEXT1_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_BOLD)
  95. #define ABOUT_TEXT1_LEFT_EDGE    0
  96. #define ABOUT_TEXT1_TOP_EDGE    10
  97. #define ABOUT_TEXT1_TEXT    "Template Editor v1.0"
  98. #define ABOUT_TEXT1_TEXT_ATTR    &topaz60_attr
  99.  
  100. #define ABOUT_TEXT2_TYPE    TEXT_DATA_TYPE_TEXT
  101. #define ABOUT_TEXT2_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
  102. #define ABOUT_TEXT2_LEFT_EDGE    0
  103. #define ABOUT_TEXT2_TOP_EDGE    30
  104. #define ABOUT_TEXT2_TEXT    "© 08/91 by Torsten Jürgeleit"
  105. #define ABOUT_TEXT2_TEXT_ATTR    &topaz80_attr
  106.  
  107. #define ABOUT_TEXT3_TYPE    TEXT_DATA_TYPE_TEXT
  108. #define ABOUT_TEXT3_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
  109. #define ABOUT_TEXT3_LEFT_EDGE    0
  110. #define ABOUT_TEXT3_TOP_EDGE    40
  111. #define ABOUT_TEXT3_TEXT    "           Am Sandberg 4    "
  112. #define ABOUT_TEXT3_TEXT_ATTR    &topaz80_attr
  113.  
  114. #define ABOUT_TEXT4_TYPE    TEXT_DATA_TYPE_TEXT
  115. #define ABOUT_TEXT4_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
  116. #define ABOUT_TEXT4_LEFT_EDGE    0
  117. #define ABOUT_TEXT4_TOP_EDGE    50
  118. #define ABOUT_TEXT4_TEXT    "           5270 Gummersbach "
  119. #define ABOUT_TEXT4_TEXT_ATTR    &topaz80_attr
  120.  
  121. #define ABOUT_TEXT5_TYPE    TEXT_DATA_TYPE_TEXT
  122. #define ABOUT_TEXT5_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
  123. #define ABOUT_TEXT5_LEFT_EDGE    0
  124. #define ABOUT_TEXT5_TOP_EDGE    60
  125. #define ABOUT_TEXT5_TEXT    "           West Germany     "
  126. #define ABOUT_TEXT5_TEXT_ATTR    &topaz80_attr
  127.  
  128. #define ABOUT_TEXT6_TYPE    TEXT_DATA_TYPE_TEXT
  129. #define ABOUT_TEXT6_FLAGS    (TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2)
  130. #define ABOUT_TEXT6_LEFT_EDGE    0
  131. #define ABOUT_TEXT6_TOP_EDGE    70
  132. #define ABOUT_TEXT6_TEXT    "           Phone 02261/27400"
  133. #define ABOUT_TEXT6_TEXT_ATTR    &topaz80_attr
  134.  
  135.     /* Statics for about requester */
  136.  
  137. STATIC struct NewWindow  about_new_window = {
  138.    0, 0, ABOUT_WINDOW_WIDTH, ABOUT_WINDOW_HEIGHT, 0, 1, ABOUT_WINDOW_IDCMP,
  139.    WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH |
  140.    ACTIVATE, NULL, NULL, ABOUT_WINDOW_TITLE, NULL, NULL, 0, 0, 0, 0,
  141.    WBENCHSCREEN
  142. };
  143. STATIC struct GadgetData  about_gadget_data[] = {
  144.    {
  145.     ABOUT_GADGET_TYPE,    /* gd_Type */
  146.     ABOUT_GADGET_FLAGS,    /* gd_Flags */
  147.     ABOUT_GADGET_LEFT_EDGE,    /* gd_LeftEdge */
  148.     ABOUT_GADGET_TOP_EDGE,    /* gd_TopEdge */
  149.     ABOUT_GADGET_WIDTH,    /* gd_Width */
  150.     ABOUT_GADGET_HEIGHT,    /* gd_Height */
  151.     ABOUT_GADGET_TEXT,    /* *gd_Text */
  152.     ABOUT_GADGET_TEXT_ATTR,    /* *gd_TextAttr */
  153.     { 0, 0, 0 }
  154.    }, {
  155.     INTUISUP_DATA_END    /* mark end of gadget data */
  156.    }
  157. };
  158. STATIC struct TextData  about_text_data[] = {
  159.    {
  160.     ABOUT_TEXT1_TYPE,    /* td_Type */
  161.     ABOUT_TEXT1_FLAGS,    /* td_Flags */
  162.     ABOUT_TEXT1_LEFT_EDGE,    /* td_LeftEdge */
  163.     ABOUT_TEXT1_TOP_EDGE,    /* td_TopEdge */
  164.     ABOUT_TEXT1_TEXT,    /* *td_Text */
  165.     ABOUT_TEXT1_TEXT_ATTR    /* *td_TextAttr */
  166.    }, {
  167.     ABOUT_TEXT2_TYPE,    /* td_Type */
  168.     ABOUT_TEXT2_FLAGS,    /* td_Flags */
  169.     ABOUT_TEXT2_LEFT_EDGE,    /* td_LeftEdge */
  170.     ABOUT_TEXT2_TOP_EDGE,    /* td_TopEdge */
  171.     ABOUT_TEXT2_TEXT,    /* *td_Text */
  172.     ABOUT_TEXT2_TEXT_ATTR    /* *td_TextAttr */
  173.    }, {
  174.     ABOUT_TEXT3_TYPE,    /* td_Type */
  175.     ABOUT_TEXT3_FLAGS,    /* td_Flags */
  176.     ABOUT_TEXT3_LEFT_EDGE,    /* td_LeftEdge */
  177.     ABOUT_TEXT3_TOP_EDGE,    /* td_TopEdge */
  178.     ABOUT_TEXT3_TEXT,    /* *td_Text */
  179.     ABOUT_TEXT3_TEXT_ATTR    /* *td_TextAttr */
  180.    }, {
  181.     ABOUT_TEXT4_TYPE,    /* td_Type */
  182.     ABOUT_TEXT4_FLAGS,    /* td_Flags */
  183.     ABOUT_TEXT4_LEFT_EDGE,    /* td_LeftEdge */
  184.     ABOUT_TEXT4_TOP_EDGE,    /* td_TopEdge */
  185.     ABOUT_TEXT4_TEXT,    /* *td_Text */
  186.     ABOUT_TEXT4_TEXT_ATTR    /* *td_TextAttr */
  187.    }, {
  188.     ABOUT_TEXT5_TYPE,    /* td_Type */
  189.     ABOUT_TEXT5_FLAGS,    /* td_Flags */
  190.     ABOUT_TEXT5_LEFT_EDGE,    /* td_LeftEdge */
  191.     ABOUT_TEXT5_TOP_EDGE,    /* td_TopEdge */
  192.     ABOUT_TEXT5_TEXT,    /* *td_Text */
  193.     ABOUT_TEXT5_TEXT_ATTR    /* *td_TextAttr */
  194.    }, {
  195.     ABOUT_TEXT6_TYPE,    /* td_Type */
  196.     ABOUT_TEXT6_FLAGS,    /* td_Flags */
  197.     ABOUT_TEXT6_LEFT_EDGE,    /* td_LeftEdge */
  198.     ABOUT_TEXT6_TOP_EDGE,    /* td_TopEdge */
  199.     ABOUT_TEXT6_TEXT,    /* *td_Text */
  200.     ABOUT_TEXT6_TEXT_ATTR    /* *td_TextAttr */
  201.    }, {
  202.     INTUISUP_DATA_END    /* mark end of text data array */
  203.    }
  204. };
  205.     /* Defines for ok/cancel requester */
  206.  
  207. #define OK_CANCEL_WINDOW_IDCMP        (CLOSEWINDOW | GADGET_IDCMP_FLAGS_BUTTON)
  208. #define OK_CANCEL_RENDER_INFO_FLAGS    (RENDER_INFO_FLAG_INNER_WINDOW | RENDER_INFO_FLAG_BACK_FILL)
  209. #define OK_CANCEL_INIT_NEW_WINDOW_FLAGS    0
  210.  
  211. #define OK_GADGET_TYPE            GADGET_DATA_TYPE_BUTTON
  212. #define OK_GADGET_FLAGS            GADGET_DATA_FLAG_HOT_KEY
  213. #define OK_GADGET_TEXT            "_Ok"
  214. #define OK_GADGET_LEFT_EDGE        0
  215. #define OK_GADGET_TOP_EDGE        0
  216. #define OK_GADGET_WIDTH            ((6 + 2) * 8)
  217. #define OK_GADGET_HEIGHT        15
  218. #define OK_GADGET_TEXT_ATTR        &topaz80_attr
  219.  
  220. #define CANCEL_GADGET_TYPE        GADGET_DATA_TYPE_BUTTON
  221. #define CANCEL_GADGET_FLAGS        GADGET_DATA_FLAG_HOT_KEY
  222. #define CANCEL_GADGET_TEXT        "_Cancel"
  223. #define CANCEL_GADGET_LEFT_EDGE        0
  224. #define CANCEL_GADGET_TOP_EDGE        0
  225. #define CANCEL_GADGET_WIDTH        ((6 + 2) * 8)
  226. #define CANCEL_GADGET_HEIGHT        15
  227. #define CANCEL_GADGET_TEXT_ATTR        &topaz80_attr
  228.  
  229.     /* Statics for ok/cancel requester */
  230.  
  231. STATIC struct NewWindow  ok_cancel_new_window = {
  232.    0, 0, 0, 0, 0, 1, OK_CANCEL_WINDOW_IDCMP, WINDOWCLOSE | WINDOWDRAG |
  233.    WINDOWDEPTH | SMART_REFRESH | NOCAREREFRESH | ACTIVATE, NULL, NULL, NULL,
  234.    NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
  235. };
  236.  
  237. STATIC struct GadgetData  ok_cancel_gadget_data[] = {
  238.    {
  239.     OK_GADGET_TYPE,            /* gd_Type */
  240.     OK_GADGET_FLAGS,        /* gd_Flags */
  241.     OK_GADGET_LEFT_EDGE,        /* gd_LeftEdge */
  242.     OK_GADGET_TOP_EDGE,        /* gd_TopEdge */
  243.     OK_GADGET_WIDTH,        /* gd_Width */
  244.     OK_GADGET_HEIGHT,        /* gd_Height */
  245.     OK_GADGET_TEXT,            /* *gd_Text */
  246.     OK_GADGET_TEXT_ATTR,        /* *gd_TextAttr */
  247.     { 0, 0, 0 }
  248.    }, {
  249.     CANCEL_GADGET_TYPE,        /* gd_Type */
  250.     CANCEL_GADGET_FLAGS,        /* gd_Flags */
  251.     CANCEL_GADGET_LEFT_EDGE,    /* gd_LeftEdge */
  252.     CANCEL_GADGET_TOP_EDGE,        /* gd_TopEdge */
  253.     CANCEL_GADGET_WIDTH,        /* gd_Width */
  254.     CANCEL_GADGET_HEIGHT,        /* gd_Height */
  255.     CANCEL_GADGET_TEXT,        /* *gd_Text */
  256.     CANCEL_GADGET_TEXT_ATTR,    /* *gd_TextAttr */
  257.     { 0, 0, 0 }
  258.    }, {
  259.     INTUISUP_DATA_END        /* mark end of gadget data */
  260.    }
  261. };
  262.     /* Show error message as continue requester */
  263.  
  264.    VOID
  265. show_error(SHORT status)
  266. {
  267.    BYTE *error;
  268.  
  269.    if (status < EDITOR_STATUS_NORMAL) {
  270.       error = error_text[-(status + 1)];
  271.       if (IntuiSupBase) {
  272.      continue_requester(ERROR_WINDOW_TITLE, error);
  273.       } else {
  274.      if (IntuitionBase) {
  275.         intuition_error_requester(error);
  276.      }
  277.       }
  278.    }
  279. }
  280.     /* Show IntuiSup continue requester */
  281.  
  282.    VOID
  283. continue_requester(BYTE *title, BYTE *text)
  284. {
  285.    struct NewWindow     *nwin = &continue_new_window;
  286.    struct Window        *win;
  287.    struct TextAttr      *ta = &topaz80_attr;
  288.    struct MsgPort       *up;
  289.    struct IntuiMessage  *msg;
  290.    APTR   ri, gl;
  291.    USHORT width, height;
  292.    BOOL   keepon = TRUE;
  293.  
  294.    nwin->Title  = (UBYTE *)title;
  295.    if (ri = IGetRenderInfo((struct Screen *)NULL, CONTINUE_RENDER_INFO_FLAGS)) {
  296.       width = IPrintText(ri, (struct Window *)NULL, text, 0, 0,
  297.               TEXT_DATA_TYPE_TEXT, TEXT_DATA_FLAG_NO_PRINT, ta);
  298.       if (width < CONTINUE_GADGET_WIDTH) {
  299.      width = CONTINUE_GADGET_WIDTH;
  300.       }
  301.       width += 40;
  302.       height = ta->ta_YSize + CONTINUE_GADGET_HEIGHT + 30;
  303.  
  304.       /* Prepare error window */
  305.       nwin->Width  = width;
  306.       nwin->Height = height;
  307.       if (win = IOpenWindow(ri, nwin, CONTINUE_OPEN_WINDOW_FLAGS)) {
  308.      IPrintText(ri, win, text, 0, 10, TEXT_DATA_TYPE_TEXT,
  309.              TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2, ta);
  310.      continue_gadget_data[0].gd_LeftEdge = (width -
  311.                          CONTINUE_GADGET_WIDTH) / 2;
  312.      continue_gadget_data[0].gd_TopEdge  = height -
  313.                           (CONTINUE_GADGET_HEIGHT + 10);
  314.      if (gl = ICreateGadgets(ri, &continue_gadget_data[0], 0, 0)) {
  315.         IDisplayGadgets(win, gl);
  316.  
  317.         /* Wait for close gadget or button pressed */
  318.         up = win->UserPort;
  319.         do {
  320.            WaitPort(up);
  321.            while (msg = IGetMsg(up)) {
  322.           switch (msg->Class) {
  323.              case CLOSEWINDOW :
  324.              case ISUP_ID :
  325.             keepon = FALSE;
  326.             break;
  327.           }
  328.            }
  329.         } while (keepon == TRUE);
  330.         IRemoveGadgets(gl);
  331.         IFreeGadgets(gl);
  332.      }
  333.      CloseWindow(win);
  334.       }
  335.       IFreeRenderInfo(ri);
  336.    }
  337. }
  338.     /* Show Intuition error requester */
  339.  
  340.    STATIC VOID
  341. intuition_error_requester(BYTE *text)
  342. {
  343.    struct Screen     screen;
  344.    struct IntuiText  itext_error, itext_ok;
  345.    USHORT border_left, border_top, width, height, max_width;
  346.  
  347.    /* Get screen dimension */
  348.    GetScreenData((BYTE *)&screen, (LONG)sizeof(struct Screen), (LONG)
  349.                           WBENCHSCREEN,    (LONG)NULL);
  350.    border_left = screen.BarHeight - screen.BarVBorder + screen.WBorTop;
  351.    border_top  = screen.WBorTop;
  352.  
  353.    /* Init message text */
  354.    itext_error.LeftEdge  = border_left;
  355.    itext_error.TopEdge   = border_top + 4;
  356.    itext_error.DrawMode  = JAM1;
  357.    itext_error.FrontPen  = 2;
  358.    itext_error.IText     = (UBYTE *)text;
  359.    itext_error.ITextFont = &topaz80_attr;
  360.    max_width             = IntuiTextLength(&itext_error);
  361.  
  362.    /* Init ok text */
  363.    itext_ok.LeftEdge  = 6;
  364.    itext_ok.TopEdge   = 4;
  365.    itext_ok.DrawMode  = JAM1;
  366.    itext_ok.FrontPen  = 3;
  367.    itext_ok.ITextFont = &topaz60_attr;
  368.    itext_ok.IText     = (UBYTE *)"Ok";
  369.    if ((width = IntuiTextLength(&itext_ok) + 2 * 16) * 2 > max_width) {
  370.       max_width = width;
  371.    }
  372.  
  373.    /* Calc requester dimension and scale it if neccessary */
  374.    width = max_width + border_left + screen.WBorRight + 2 * 16;
  375.    if (width > screen.Width) {
  376.       width = screen.Width;
  377.    }
  378.    height = border_top + screen.WBorBottom + 8 + 10 + 9 + 2 * 8 + 2 * 4;
  379.    if (height > screen.Height) {
  380.       height = screen.Height;
  381.    }
  382.    AutoRequest((LONG)NULL, &itext_error, &itext_ok, &itext_ok, 0L, 0L,
  383.                          (LONG)width, (LONG)height);
  384. }
  385.     /* Show about requester */
  386.  
  387.    VOID
  388. about_requester(VOID)
  389. {
  390.    struct NewWindow     *nwin = &about_new_window;
  391.    struct Window        *win;
  392.    struct MsgPort       *up;
  393.    struct IntuiMessage  *msg;
  394.    APTR ri, gl;
  395.    BOOL keepon = TRUE;
  396.  
  397.    if (ri = IGetRenderInfo((struct Screen *)NULL, ABOUT_RENDER_INFO_FLAGS)) {
  398.       nwin->Width  = ABOUT_WINDOW_WIDTH;
  399.       nwin->Height = ABOUT_WINDOW_HEIGHT;
  400.       if (win = IOpenWindow(ri, nwin, ABOUT_OPEN_WINDOW_FLAGS)) {
  401.      IDisplayTexts(ri, win, &about_text_data[0], 0, 0);
  402.      if (gl = ICreateGadgets(ri, &about_gadget_data[0], 0, 0)) {
  403.         IDisplayGadgets(win, gl);
  404.  
  405.         /* Wait for close gadget or button pressed */
  406.         up = win->UserPort;
  407.         do {
  408.            WaitPort(up);
  409.            while (msg = IGetMsg(up)) {
  410.           switch (msg->Class) {
  411.              case CLOSEWINDOW :
  412.              case ISUP_ID :
  413.             keepon = FALSE;
  414.             break;
  415.           }
  416.            }
  417.         } while (keepon == TRUE);
  418.         IRemoveGadgets(gl);
  419.         IFreeGadgets(gl);
  420.      }
  421.      CloseWindow(win);
  422.       }
  423.       IFreeRenderInfo(ri);
  424.    }
  425. }
  426.     /* Show IntuiSup ok/cancel requester */
  427.  
  428.    BOOL
  429. ok_cancel_requester(BYTE *title, BYTE *text)
  430. {
  431.    struct NewWindow     *nwin = &ok_cancel_new_window;
  432.    struct Window        *win;
  433.    struct TextAttr      *ta = &topaz80_attr;
  434.    struct MsgPort       *up;
  435.    struct IntuiMessage  *msg;
  436.    APTR   ri, gl;
  437.    USHORT width, height;
  438.    BOOL   result = FALSE, keepon = TRUE;
  439.  
  440.    nwin->Title  = (UBYTE *)title;
  441.    if (ri = IGetRenderInfo((struct Screen *)NULL,
  442.                          OK_CANCEL_RENDER_INFO_FLAGS)) {
  443.       width = IPrintText(ri, (struct Window *)NULL, text, 0, 0,
  444.               TEXT_DATA_TYPE_TEXT, TEXT_DATA_FLAG_NO_PRINT, ta);
  445.       if (width < (OK_GADGET_WIDTH + 20 + CANCEL_GADGET_WIDTH)) {
  446.      width = OK_GADGET_WIDTH + 20 + CANCEL_GADGET_WIDTH;
  447.       }
  448.       width += 40;
  449.       height = ta->ta_YSize + OK_GADGET_HEIGHT + 30;
  450.  
  451.       /* Prepare error window */
  452.       nwin->Width  = width;
  453.       nwin->Height = height;
  454.       if (win = IOpenWindow(ri, nwin, CONTINUE_OPEN_WINDOW_FLAGS)) {
  455.      IPrintText(ri, win, text, 0, 10, TEXT_DATA_TYPE_TEXT,
  456.              TEXT_DATA_FLAG_CENTER | TEXT_DATA_FLAG_COLOR2, ta);
  457.      ok_cancel_gadget_data[0].gd_LeftEdge = 20;
  458.      ok_cancel_gadget_data[0].gd_TopEdge  = height - (OK_GADGET_HEIGHT +
  459.                                     10);
  460.      ok_cancel_gadget_data[1].gd_LeftEdge = width -
  461.                          (CANCEL_GADGET_WIDTH +    20);
  462.      ok_cancel_gadget_data[1].gd_TopEdge  = height -
  463.                         (CANCEL_GADGET_HEIGHT + 10);
  464.      if (gl = ICreateGadgets(ri, &ok_cancel_gadget_data[0], 0, 0)) {
  465.         IDisplayGadgets(win, gl);
  466.  
  467.         /* Wait for close gadget or button pressed */
  468.         up = win->UserPort;
  469.         do {
  470.            WaitPort(up);
  471.            while (msg = IGetMsg(up)) {
  472.           switch (msg->Class) {
  473.              case CLOSEWINDOW :
  474.              case ISUP_ID :
  475.             if (!msg->Code) {
  476.                result = TRUE;   /* Ok */
  477.             }
  478.             keepon = FALSE;
  479.             break;
  480.           }
  481.            }
  482.         } while (keepon == TRUE);
  483.         IRemoveGadgets(gl);
  484.         IFreeGadgets(gl);
  485.      }
  486.      CloseWindow(win);
  487.       }
  488.       IFreeRenderInfo(ri);
  489.    }
  490.    return(result);
  491. }
  492.